package com.weblog.weblog.web.markdown;

import com.weblog.weblog.web.markdown.renderer.ImageNodeRenderer;
import com.weblog.weblog.web.markdown.renderer.LinkNodeRenderer;
import org.commonmark.Extension;
import org.commonmark.ext.gfm.tables.TablesExtension;
import org.commonmark.ext.heading.anchor.HeadingAnchorExtension;
import org.commonmark.ext.image.attributes.ImageAttributesExtension;
import org.commonmark.ext.task.list.items.TaskListItemsExtension;
import org.commonmark.node.Node;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.HtmlRenderer;

import java.util.Arrays;
import java.util.List;

/**
 * @author gc
 * @date 2023年11月01日 21:29
 */

public class MarkdownHelper {

    /**
     * Markdown 解析器
     */
    private final static Parser PARSER;
    /**
     * HTML 渲染器
     */

    private final static HtmlRenderer HTML_RENDERER;
    //初始化
    static {
        //拓展
        List<Extension> extensions = Arrays.asList(
                TablesExtension.create(),  //表格拓展
                HeadingAnchorExtension.create(),  //标题锚定项
                ImageAttributesExtension.create(),  // 图片宽高
                TaskListItemsExtension.create()  // 任务列表
        );

        PARSER = Parser.builder().extensions(extensions).build();
        HTML_RENDERER = HtmlRenderer.builder()
                .extensions(extensions)
                .nodeRendererFactory(context -> new ImageNodeRenderer(context)) // 自定义图片解析
                .nodeRendererFactory(context -> new LinkNodeRenderer(context)) // 自定义超链接解析
                .build();
    }
    /**
     * 将 markdown 转换成 HTMl
     * @author gc
     * @date 2023/11/1 21:34
     * @return java.lang.String
     */

    public static String convertMarkdown2Html(String markdown){
        Node document = PARSER.parse(markdown);
        return HTML_RENDERER.render(document);
    }

    public static void main(String[] args) {
        String markdown = "![图 1-1 技术栈](https://img.quanxiaoha.com/quanxiaoha/169560181378937 \"图 1-1 技术栈\"){width=100 height=100}";
        System.out.println(MarkdownHelper.convertMarkdown2Html(markdown));
    }
}
